package dao

import (
	"database/sql"
	"errors"
	"goseckill/common"
	"goseckill/models"
	"log"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 定义对user表的操作
// 通过接口规范
type IUserDao interface {
	Conn() error
	Select(userName string) (user *models.User, err error)
	Insert(user *models.User)(userID int64, err error)
}

// 接口的实现类
type UserManager struct{
	table string
	conn *gorm.DB
}

func NewUserDao(table  string, db *sql.DB) IUserDao {
	gormDB,err  :=gorm.Open(mysql.New(mysql.Config{
		Conn: db,
	}), &gorm.Config{})  // 根据现有数据库连接创建
	if err!=nil {log.Fatal(err)}

	return &UserManager{table: table,conn: gormDB}
}

// 实现具体的方法
// 构建链接
func (u *UserManager) Conn() (err error) {
	if u.conn == nil {
		// 创建新的mysql链接
		mysqlConn,err := common.NewGormMysqlConn()
		if err!=nil {return err}
		u.conn = mysqlConn
	}
	if u.table == "" {
		u.table = "users"  // 表单数
	}
	return 
}
// 查询
func (u *UserManager) Select(userName string) (user *models.User, err error) {
	if userName=="" {
		return &models.User{},errors.New("userName can not be nil!")
	}
	if err = u.Conn(); err!=nil {
		return &models.User{},err
	}
	// 进入查询
	// u.conn.First(&user)   // 不合适
	// 直接根据条件查 select
	// u.conn.Model(&models.User{}).Where("user_name=?", userName)
	u.conn.Model(&models.User{}).Where("user_name=?", userName)

	// 对数据的解析，不应该放到这里进行判断
	// 即，数据可能是0，但是这属于业务逻辑的一部分
	return 
}

func (u *UserManager) Insert(user *models.User)(userID int64, err error) {
	if err = u.Conn();err!=nil {
		return 
	}
	log.Println(u.table)
	// 插入
	err = u.conn.Create(user).Error
	return userID,err
}